/*
    SUSAN® - Sole of Unix Save ANything

   Copyright (C) 2013-2015 Hechzh Property

   
*/

#ifndef BAREOS_LIB_BSOCK_TCP_H_
#define BAREOS_LIB_BSOCK_TCP_H_

#include "lib/bsock.h"

class BareosSocketTCP : public BareosSocket {
 public:
  /*
   * the header of a Bareos packet is 32 bit long.
   * A value
   *    < 0: indicates a signal
   *   >= 0: the length of the message that follows
   */
  static const int32_t header_length = sizeof(int32_t);

 private:
  /*
   * max size of each single packet.
   * 1000000 is used by older version of Bareos/Bacula,
   * so stick to this value to be compatible with older version of bconsole.
   */
  static const int32_t max_packet_size = 1000000;
  static const int32_t max_message_len = max_packet_size - header_length;

  /* methods -- in bsock_tcp.c */
  void FinInit(JobControlRecord* jcr,
               int sockfd,
               const char* who,
               const char* host,
               int port,
               struct sockaddr* lclient_addr) override;
  bool open(JobControlRecord* jcr,
            const char* name,
            const char* host,
            char* service,
            int port,
            utime_t heart_beat,
            int* fatal) override;
  bool SetKeepalive(JobControlRecord* jcr,
                    int sockfd,
                    bool enable,
                    int keepalive_start,
                    int keepalive_interval);
  bool SendPacket(int32_t* hdr, int32_t pktsiz);
  void DumpNetworkMessageToFile(const char* ptr, int nbytes);

 public:
  BareosSocketTCP();
  ~BareosSocketTCP();

  /* methods -- in bsock_tcp.c */
  BareosSocket* clone() override;
  bool connect(JobControlRecord* jcr,
               int retry_interval,
               utime_t max_retry_time,
               utime_t heart_beat,
               const char* name,
               const char* host,
               char* service,
               int port,
               bool verbose) override;
  int32_t recv() override;
  bool send() override;
  bool fsend(const char*, ...);
  int32_t read_nbytes(char* ptr, int32_t nbytes) override;
  int32_t write_nbytes(char* ptr, int32_t nbytes) override;
  bool signal(int signal);
  void close() override;
  void destroy() override;
  int GetPeer(char* buf, socklen_t buflen) override;
  bool SetBufferSize(uint32_t size, int rw) override;
  int SetNonblocking() override;
  int SetBlocking() override;
  void RestoreBlocking(int flags) override;
  bool ConnectionReceivedTerminateSignal() override;
  int WaitData(int sec, int usec = 0) override;
  int WaitDataIntr(int sec, int usec = 0) override;
};

#endif /* BAREOS_LIB_BSOCK_TCP_H_ */
